package core;

import constant.Constant;

import java.util.concurrent.atomic.LongAdder;

/**
 * 文件下载信息任务类
 */
public class DownloaderInfoThread implements Runnable {


    //本地已下载文件大小
    private static  LongAdder finishedSize = new LongAdder();
    //本次累计下载大小 多线程下载下需要保证可见性
    public static volatile LongAdder downSize = new LongAdder();
    //下载文件总大小
    private Long httpFileContentLength;
    //前一次下载大小
    private double preSize;

    public DownloaderInfoThread(long httpFileContentLength) {
        this.httpFileContentLength = httpFileContentLength;
    }


    @Override
    public void run() {
        //计算文件总大小 MB
        String httpFileSize = String.format("%.2f", httpFileContentLength / Constant.MB);

        //计算每秒下载速度 kb
        int speed = (int) ((downSize.doubleValue() - preSize) / 1024d);
        //每一次执行线程后都将前一次下载大小更新成本次累计下载大小
        preSize = downSize.doubleValue();

        //剩余文件大小
        double remainSize = httpFileContentLength - finishedSize.doubleValue() - downSize.doubleValue();


        //计算剩余时间
        String remainTime = String.format("%.1f", remainSize / 1024d / speed);

        //如果计算出来的时间是无限大，则默认为-
        if ("Infinity".equalsIgnoreCase(remainTime)) {
            remainTime = "-";
        }

        //已下载大小
        String currentSize = String.format("%.2f", (downSize.doubleValue() - finishedSize.doubleValue()) / Constant.MB);

        String print = String.format("已下载 %smb/%smb，速度 %skb/s，剩余时间 %ss", currentSize, httpFileSize, speed, remainTime);

        System.out.print("\r");
        System.out.print(print);


    }
}
